#URL短縮など、ツィートの文章を作るときに役立つ機能を提供
require 'rubygems'
require 'json'

load 'config.rb',true
require 'uri'
require 'net/http'

#文字列が長いときは後ろを省略するよ
def shorten_message(message,limit=140)
	strs = message.split(//u)
	if (limit < strs.length) then
		new_message=strs[0..(limit-10)].join
		return new_message.concat(" (ry")
	end
	return message
end
#Test
#p shorten_message("いろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつねいろはにほへとちりぬるをわがよたれそつね")
 

#文章中のURLを短縮URLと置き換えるよ
def replace_uri(message,mode='shorten_bitly')
	#bit.lyがおすすめなんだよ
	mode = 'shorten_tinyurl' if($config[:BITLY_ID]=='' or $config[:BITLY_API_KEY]=='')
	str = message.dup
	URI.extract(message, %w[http https ftp]) do |uri|

		case mode
		when 'shorten_bitly'
			new_uri = bitly_shorten_uri(uri)
		when 'shorten_tinyurl'
			new_uri = tinyurl_shorten_url(uri)
		when 'expand'
			case uri
			when %r(bit.ly|j.mp)
				new_uri = bitly_expand_url(uri)
			when %r(tinyurl.com)
				new_uri = tinyurl_expand_url(uri)
			end
		end
		str.gsub!(uri,new_uri) if(new_uri!=nil)
  end
  return str
end

#bit.lyを使ってURLを短縮する。ただし、アカウントの設定をしてないときは短縮せずに返す
def bitly_shorten_uri(long_url='')
	id = $config[:BITLY_ID]
	api_key = $config[:BITLY_API_KEY]
	version = 'v3'
	return long_url if(id=='' or api_key=='')

	#URLエンコードしとく事
	query = "longUrl=#{URI.encode(long_url)}&login=#{id}&apiKey=#{api_key}&format=json"
	result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/shorten?#{query}"))
	return result['data']['url']  if long_url == result['data']['long_url']
	return long_url
end

#bitlyで短縮したURLを元に戻す
def bitly_expand_url(short_url)
	id = $config[:BITLY_ID]
	api_key = $config[:BITLY_API_KEY]
	version = 'v3'
	return short_url if(id=='' or api_key=='')
	
	#URLエンコードしとく事
	query = "shortUrl=#{URI.encode(short_url)}&login=#{id}&apiKey=#{api_key}&format=json"
	result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/expand?#{query}"))
	return result['data']['expand'][0]['long_url']  if short_url == result['data']['expand'][0]['short_url']
	return short_url
end

def tinyurl_shorten_url(long_url)
	query = "url=#{URI.encode(long_url)}"
	result = Net::HTTP.get("tinyurl.com", "/api-create.php?#{query}")
	return result
end

#TinyURLで短縮したURLを元に戻す。
#TinyURLは公式では短縮URLの復元を行ってない。。。
#http://d.hatena.ne.jp/os0x/20090215/1234686704
def tinyurl_expand_url(short_url)
	query = "url=#{URI.encode(short_url)}"
	result = JSON.parse(Net::HTTP.get("ss-o.net", "/api/reurl.json?#{query}"))
	return result['url'] if result['url']!=nil
	return short_url
end

#Test bit_ly
#p replace_uri('j.mpもできる？ http://j.mp/aTRsF4','expand')
#p replace_uri('これは成功するよhttp://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/shorten')
#p replace_uri('複数でテスト http://d.hatena.ne.jp/m-kawato/20090603/1244041964 と http://twitter.com/ronbuntter')
#p replace_uri("のばしてみるテスト http://bit.ly/bO651I",'expand')
#p replace_uri("複数でテスト http://bit.ly/bO651I と http://bit.ly/aTGTx3",'expand')
#「&」とかを使ったURLは失敗する
#p replace_uri('長いURLを短くしてみるテスト http://www.google.co.jp/search?client=safari&rls=en&q=Ruby+dup&ie=UTF-8&oe=UTF-8&redir_esc=&ei=BKhHTJXaPJPsvQOJ6Ky-Aw')

